package com.app.common.core;

import com.app.common.vo.DebeziumMessage;
import com.app.common.vo.DebeziumMessage.OpType;

/**
 * 
 * @author 北京八维博大科技 薛建新
 * @date 2022年12月23日 11:24:01
 * @Copyright 北京八维博大科技
 */
public abstract class BaseMessageHandler<T, ID> implements IMessageHandler {

	private static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BaseMessageHandler.class);

	@Override
	public boolean handleMessage(DebeziumMessage msg) {

		if (msg.getOp() == OpType.e) {// 删除后的墓碑消息
			log.info("======recive a dumb message,{}", msg.getKey());
			return true;
		}
		// 处理原始消息，可以添加,修改或删除字段
		preProcess(msg);
		T en = null;
		try {

			switch (msg.getOp()) {
			case r:
			case c:
				en = handleCreate(msg);
				break;
			case u:
				en = handleUpdate(msg);
				break;
			case d:// 多数据库复制时是否要删除?
				en = handleDelete(msg);
				break;

			default:
				break;
			}
			// 后置处理
			postProcess(en);
			return true;
		} catch (Exception e) {
			log.error("", e);
			return false;
		}
	}

	/**
	 * 处理原始消息，可以添加,修改或删除字段
	 * 
	 * @author xuejx
	 * @param msg
	 */
	protected void preProcess(DebeziumMessage msg) {
		// msg.getAfter().put("key1", "value1"); //添加一个字段
		// msg.getAfter().put("key1", null); //删除一个字段
	}

	protected void postProcess(T entity) {
	}

	protected abstract T handleDelete(DebeziumMessage msg);

	protected abstract T handleUpdate(DebeziumMessage msg);

	protected abstract T handleCreate(DebeziumMessage msg);

}
